package com.nas.crocus.service.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.nas.crocus.dao.RegistroPasajeroDao;
import com.nas.crocus.domain.Pasajero;
import com.nas.crocus.domain.RegistroPasajero;
import com.nas.crocus.exception.EntidadNoUnicaException;
import com.nas.crocus.exception.NotFoundException;
import com.nas.crocus.exception.PrecondicionNoCumplidaException;
import com.nas.crocus.service.PasajeroService;
import com.nas.crocus.service.RegistroPasajeroService;

@Service
@Transactional
public class RegistroPasajeroServiceImpl implements RegistroPasajeroService {

    @Autowired
    private RegistroPasajeroDao registroPasajeroDao;
    
    @Autowired
    private PasajeroService pasajeroService;
    
    @Override
    public RegistroPasajero obtenerPorEventoId(Long eventoId) throws NotFoundException {
        RegistroPasajero registroPasajero = registroPasajeroDao.obtenerPorEventoId(eventoId);
        if (registroPasajero == null) {
            throw new NotFoundException("No se encontro el evento con id[" + eventoId + "]");
        } 
        return registroPasajero;
    }

    @Override
    public Collection<Pasajero> buscarPasajerosPorEventoId(Long eventoId) {
        Collection<Pasajero> pasajeros = null;
        RegistroPasajero registroPasajero = registroPasajeroDao.obtenerPorEventoId(eventoId);
        if (registroPasajero == null) {
            pasajeros = new ArrayList<Pasajero>();
        } else {
            pasajeros = registroPasajero.getPasajeros();
        }        
        return pasajeros;
    }

    @Override
    public Collection<Pasajero> buscarMiembroPorPatronApellidoNombreNumeroDocumento(Long eventoId, String patron) {
        RegistroPasajero registroPasajero = registroPasajeroDao.obtenerPorEventoId(eventoId);
        ArrayList<Pasajero> resultado = new ArrayList<Pasajero>(); 
        try {
            Integer.parseInt(patron);
            patron = patron + ".*";
            String numeroDoc;
            
            for (Pasajero pasajero : registroPasajero.getPasajeros()) {
                numeroDoc = pasajero.getPersona().getNumeroDoc().toString();
                if (numeroDoc.matches(patron) && pasajero.getAcompanianteDe() == null) {
                    resultado.add(pasajero);
                }
            }
        } catch (NumberFormatException nfe){
            patron = "(?i:"+patron+".*)";
            String apellido;
            String nombre;
            for (Pasajero pasajero : registroPasajero.getPasajeros()) {   
                apellido = pasajero.getPersona().getApellido();
                nombre = pasajero.getPersona().getNombre();
                if ((apellido.matches(patron) || nombre.matches(patron)) && pasajero.getAcompanianteDe() == null ) {
                    resultado.add(pasajero);
                }
            }
        }
        
        return resultado;
    }

    @Override
    public void registrarPasajero(Long eventoId, Pasajero pasajero) throws EntidadNoUnicaException, PrecondicionNoCumplidaException {
        RegistroPasajero registroPasajero = registroPasajeroDao.obtenerPorEventoId(eventoId);
        registroPasajero.setCantidadAsistentes(registroPasajero.getCantidadAsistentes()+1);
        pasajero.setRegistroPasajero(registroPasajero);
        pasajeroService.guardar(pasajero);
        registroPasajeroDao.actualizar(registroPasajero);
    }

    @Override
    public void guardar(RegistroPasajero registroPasajero) {
       registroPasajeroDao.guardar(registroPasajero);
        
    }
    
    

   
    
    
}
